home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / MCASM.RAR / MC_ASM.EXE / WROX_ASM / CH10 / PROGRAMS / RLE.ASM < prev    next >
Assembly Source File  |  1994-05-30  |  4KB  |  216 lines

  1. ; RLE coding
  2. ; Written by Malakhov K.A.
  3. ; Compile with TASM 3.0 or latter
  4. ;         TASM RLE.ASM /MX /ZX /O
  5. ; CALL:    rle_encode(char *buffinput,unsigned int inputlength,
  6. ;            char *buffoutput);
  7. ; CALL:    rle_decode(char *buffinput,unsigned int inputlength,
  8. ;            char *buffoutput);
  9.  
  10. model large
  11.  
  12. PUBLIC    _rle_encode
  13. PUBLIC    _rle_decode
  14.  
  15. .code
  16.  
  17. _rle_encode    PROC    C FAR
  18.         ARG    buffi:dword,leng:word,buffo:dword
  19.         USES    bx,cx,dx,di,si,ds,es
  20. ; Initialization
  21.         mov    ax,leng
  22.         mov    cs:lng,ax
  23.  
  24.         mov    ax,word ptr buffi+2
  25.         mov    ds,ax
  26.         mov    ax,word ptr buffo+2
  27.         mov    es,ax
  28.         mov    si,word ptr buffi
  29.         mov    di,word ptr buffo
  30.  
  31.         mov    cs:count1,di
  32.         mov    cs:count2,0
  33.         mov    cs:begflg,1
  34.         inc    di
  35.         cld
  36. ; Loop
  37. ARH_01:        mov    cl,3fh
  38.         mov    cs:count3,0
  39. ARH_02:        lodsb
  40.         mov    bx,leng
  41.         dec    bx
  42.         mov    leng,bx
  43.         cmp    bx,3
  44.         ja    ARH_03
  45.         jmp    ARH_kon
  46. ; Compare with next byte
  47. ARH_03:        cmp    al,byte ptr ds:[si]
  48.         je    ARH_04
  49. ; Not equal.
  50. ARH_031:    mov    cs:begflg,0
  51.         stosb
  52.         inc    word ptr cs:count2
  53.         mov    ax,word ptr cs:count2
  54.         cmp    ax,64000
  55.         jbe    ARH_0311
  56.         jmp    ARH_09
  57. ARH_0311:    inc    byte ptr cs:count3
  58.         dec    cl
  59.         jnz    ARH_02
  60. ; Set controll code for not compressed block
  61.         mov    dl,cs:count3
  62.         or    dl,10000000b
  63.         mov    bx,cs:count1
  64.         mov    es:[bx],dl
  65.         inc    word ptr cs:count2
  66.         mov    cs:count1,di
  67.         inc    di
  68.         mov    cs:begflg,1
  69.         jmp    ARH_01
  70.  
  71. ARH_032:    dec    di
  72.         jmp    short    ARH_041
  73. ; Compare with third byte
  74. ARH_04:        cmp    al,byte ptr ds:[si+1]
  75.         jne    ARH_031
  76.         dec    si
  77.         inc    word ptr leng
  78.         cmp    cs:begflg,1
  79.         je    ARH_032
  80. ; Set not compressed block
  81.         mov    dl,cs:count3
  82.         or    dl,10000000b
  83.         mov    bx,cs:count1
  84.         mov    es:[bx],dl
  85.         inc    word ptr cs:count2
  86. ; Begin compressed block
  87. ARH_041:    mov    cl,3fh
  88.         mov    cs:count3,0
  89. ARH_05:        lodsb
  90.         mov    bx,leng
  91.         dec    bx
  92.         mov    leng,bx
  93.         cmp    bx,1
  94.         jbe    ARH_06
  95.         cmp    al,byte ptr ds:[si]
  96.         jne    ARH_06
  97.         inc    byte ptr cs:count3
  98.         dec    cl
  99.         jnz    ARH_05
  100.         mov    dl,cs:count3
  101.         mov    es:[di],dl
  102.         inc    di
  103.         inc    word ptr cs:count2
  104.         mov    es:[di],al
  105.         inc    word ptr cs:count2
  106.         inc    di
  107.         mov    cs:count1,di
  108.         jmp    ARH_041
  109. ARH_06:        mov    dl,cs:count3
  110.         inc    dl
  111.         mov    es:[di],dl
  112.         inc    di
  113.         inc    word ptr cs:count2
  114.         mov    es:[di],al
  115.         inc    word ptr cs:count2
  116.         inc    di
  117.         mov    cs:count1,di
  118.         inc    di
  119.         mov    cs:begflg,1
  120.         jmp    ARH_01
  121. ARH_kon:    stosb
  122.         inc    word ptr cs:count2
  123.         mov    cx,cs:count2
  124.         cmp    cx,64000
  125.         ja    ARH_09
  126. ; Save the rest of bytes
  127.         inc    byte ptr cs:count3
  128.         mov    cx,leng
  129. ARH_07:        cmp    cx,1
  130.         jb    ARH_08
  131. ARH_071:    movsb
  132.         inc    word ptr cs:count2
  133.         mov    ax,cs:count2
  134.         cmp    ax,cs:lng
  135.         ja    ARH_09
  136.  
  137.         inc    byte ptr cs:count3
  138.         dec    cx
  139.         jnz    ARH_071
  140. ARH_08:
  141.         mov    al,cs:count3
  142.         or    al,10000000b
  143.         mov    bx,cs:count1
  144.         mov    es:[bx],al
  145.         inc    word ptr cs:count2
  146.  
  147.         mov    ax,cs:cs:count2
  148.         ret
  149.  
  150. ARH_09:        xor    ax,ax
  151.         ret
  152.  
  153. count1        dw    ?    ; Ptr for controll code
  154. count2        dw    ?    ; Total bytes counter
  155. count3        db    ?    ; Bytes counter in block
  156. begflg        db    ?
  157. lng        dw    ?
  158.  
  159. _rle_encode    ENDP
  160.  
  161. ; Decompression
  162. _rle_decode    PROC    C FAR
  163.         ARG    buffi:dword,leng:word,buffo:dword
  164.         USES    bx,cx,dx,di,si,ds,es
  165. ; Init
  166.         mov    ax,word ptr buffi+2
  167.         mov    ds,ax
  168.         mov    ax,word ptr buffo+2
  169.         mov    es,ax
  170.         mov    si,word ptr buffi
  171.         mov    di,word ptr buffo
  172.  
  173.         mov    cs:count1,di
  174.         cld
  175. ; Load byte
  176. DARH_01:    lodsb
  177.         mov    bx,leng
  178.         dec    bx
  179.         mov    leng,bx
  180.         cmp    bx,0
  181.         je    DARH_kon
  182. ; Check block
  183.         test    al,10000000b
  184.         jz    DARH_02
  185. ; Do not compressed
  186.         and    al,01111111b
  187.         mov    cl,al
  188.         xor    ch,ch
  189. DARH_011:    movsb
  190.         mov    bx,leng
  191.         dec    bx
  192.         mov    leng,bx
  193.         cmp    bx,0
  194.         je    DARH_kon
  195.         dec    cx
  196.         jnz    DARH_011
  197.         jmp    short    DARH_01
  198. ; Compressed
  199. DARH_02:    mov    cl,al
  200.         xor    ch,ch
  201.         lodsb
  202.         mov    bx,leng
  203.         dec    bx
  204.         mov    leng,bx
  205.         cmp    bx,0
  206.         je    DARH_kon
  207.     rep    stosb
  208.         jmp    short    DARH_01
  209. DARH_kon:    mov    ax,di
  210.         sub    ax,cs:count1
  211.         ret
  212.  
  213. _rle_decode    ENDP
  214.  
  215.         END
  216.